创建容器
新建容器
1 | docker create -it ubuntu:16.04 |
-i:保持标准输入打开
-t:是否分配一个伪终端
使用docker create创建的容器默认是停止状态
1 | root@ubuntu:~# docker ps |
查看已经启动的容器
1 | root@ubuntu:~# docker ps -a |
查看所有的容器
启动容器
1 | docker start f9736 |
使用docker start + 容器的ID来启动容器
1 | root@ubuntu:~# docker ps |
再次使用docker ps就能看见刚刚启动的容器了
新建并启动容器
1 | docker run ubuntu:14.04 /bin/echo "11111" |
docker run等价于先执行docker create 在执行docker start,之后输出11111,最后停止容器。
当使用docker run来创建容器时,在docker后台运行的标准操作包括:
- 检查本地是否要要运行的镜像,不存在就从公有仓库下载
- 利用镜像来创建一个容器,并启动该容器
- 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟的接口到容器中
- 从网桥的地址池分配一个IP地址给容器
- 执行用户的应用程序
- 执行完毕后容器自动终止
1 | root@ubuntu:~# docker run -it ubuntu:14.04 /bin/bash |
可以使用ctrl + d 或者exit退出容器
守护态运行
1 | docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo 1111; sleep 1;done" |
加上参数-d就能让容器在后台以守护态方式运行。
可以使用docker logs + id 查看日志信息1
2
3
4
5root@ubuntu:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a1cce3f1981 ubuntu:14.04 "/bin/sh -c 'while..." 3 minutes ago Up 3 minutes musing_goldstine
565d89975177 ubuntu:14.04 "/bin/sh -c 'while..." About an hour ago Up About an hour naughty_babbage
f9736e4b4e92 ubuntu:16.04 "/bin/bash" 2 hours ago Up 2 hours elated_shockley
1 | root@ubuntu:~# docker logs 7a1cce |
终止容器
1 | root@ubuntu:~# docker ps |
使用dcoker stop + id可以实现容器的停止【首先发送SIGTERM信号,10s后在发送SIGKILL来终止容器】1
2root@ubuntu:~# docker stop 7a1cce
7a1cce
使用dcoker kill + id可以实现容器的停止【直接发送SIGKILL来终止容器】1
2root@ubuntu:~# docker kill 565d
565d
使用dcoker restart + id可以实现容器的重新启动1
2root@ubuntu:~# docker restart 7a1cc
7a1cc
使用dcoker start + id可以实现容器的停止1
2root@ubuntu:~# docker start 565d89
565d89
使用dcoker ps -qa可以查看所用容器的id1
2
3
4root@ubuntu:~# docker ps -qa
7a1cce3f1981
565d89975177
f9736e4b4e92
进入容器
当容器使用-d参数时,容器后进入后台。用户无法看到容器的信息,也无法进行操作。下面介绍三种进入容器的方法。1
2
3
4
5root@ubuntu:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a1cce3f1981 ubuntu:14.04 "/bin/sh -c 'while..." 26 minutes ago Up 5 seconds musing_goldstine
565d89975177 ubuntu:14.04 "/bin/sh -c 'while..." About an hour ago Up 11 minutes naughty_babbage
f9736e4b4e92 ubuntu:16.04 "/bin/bash" 3 hours ago Up 2 hours elated_shockley
attach
1 | root@ubuntu:~# docker attach 7a1cce3f1981 |
使用docker attach + 容器名称/容器id【注意这里是容器的名称】
使用attach不方便,因为当多个窗口同时使用attach连接到同一个容器的时候,所有的窗口都会同步显示。当某个窗口阻塞的时候,其他窗口也无法执行其他操作了。
exec
1 | root@ubuntu:~# docker exec -it 565d89975177 /bin/bash |
使用docker exec + 选项 + 命令 【上面的-it表示打开标准输入和输出,并分配一个伪终端】,exec命令是推荐的对容器的操作方式。
其他参数:
-t:分配伪终端,默认为false
-i:打开标准输入,默认是false
–privileged:是否以最高权限执行命令,默认为false
-u:执行命令的用户名或uid
nsenter
删除容器
1 | root@ubuntu:~# docker ps -a |
删除一个容器1
2root@ubuntu:~# docker rm 7a1cce3f1981
7a1cce3f1981
docker rm 命令只能删除处于终止火车退出状态的容器。并不能删除还处于运行状态的容器。可以添加-f参数来删除一个还在运行中的容器。使用-f参数,Docker会先发一个SIGKILL信号给容器,终止应用,再将其删除。1
2
3
4root@ubuntu:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
565d89975177 ubuntu:14.04 "/bin/sh -c 'while..." 4 hours ago Up 3 hours naughty_babbage
f9736e4b4e92 ubuntu:16.04 "/bin/bash" 6 hours ago Up 6 hours elated_shockley
不使用-f参数1
2root@ubuntu:~# docker rm 565d89975177
Error response from daemon: You cannot remove a running container 565d89975177b855ebf9e80636e85613b5ad9f9e40ef9c5f7f6edeca12efd155. Stop the container before attempting removal or use -f
使用-f参数删除1
2root@ubuntu:~# docker rm -f 565d89975177
565d89975177
导入导出容器
使用docker export可以到处一个容器,不管是这个容器是否处于运行状态
导出容器
1 | root@ubuntu:~# docker export -o test_export.tar.gz f9736e4b4e92 |
docker export -o + 文件路径及名称 + 容器id
导入容器
1 | root@ubuntu:~# docker import test_export.tar.gz rexyan/ubuntu:v1.0 |
可以使用docker import + 文件 + 镜像标签
结果1
2
3
4
5root@ubuntu:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rexyan/ubuntu v1.0 fb9d66f12998 12 seconds ago 85.2 MB
ubuntu 16.04 adfebeb0ac91 3 weeks ago 111 MB
ubuntu 14.04 b42bcb3a6514 3 weeks ago 210 MB
实际上我们也可以使用docker load来导入一个镜像到本地镜像库,也可以使用docker import来导入一个容器快照到本地镜像库。这两者的区别在于:
- 容器快照将丢失所有的历史记录和元数据信息【即仅保存容器当时的快照信息】,而镜像文件将保存完整的记录。
- 容器快照的大小与镜像相比,容器快照的大小更小。
- 容器快照的导入方式可以重新指定标签等元数据信息。
拷贝文件到容器中
1 | docker cp /tmp/文件.tar.gz 70939372d08a:/tmp |
拷贝/tmp/文件.tar.gz文件到 70939372d08a容器中的/tmp目录下
总结
1 | docker create -it ubuntu:16.04 # 使用 ubuntu:16.04 创建一个带标准输入且有终端的容器,这个容器处于停止状态 |